import cv2
import numpy as np

# 载入视频文件
vedio = cv2.VideoCapture('bike.mp4')

# 定义压缩比列表
keep_list = [0.5, 0.05]

def compression(fft_shift, compression_ratio):
    mag = np.abs(fft_shift)#取绝对值
    thresh = np.percentile(mag, 100 - 100 * compression_ratio)
    mask = mag > thresh# 创建掩码，保留振幅大于阈值的频率分量
    compressed_shift = fft_shift * mask
    return compressed_shift

while vedio.isOpened():

    # 读取一帧图像
    ret, frame = vedio.read()

    # 如果没有读取到帧则退出循环
    if not ret:
        break

    # 灰度影像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 在名为 "original" 的窗口中显示灰度图像
    cv2.imshow('original', gray)

    # 傅里叶变换
    fft = np.fft.fft2(gray)
    fft_shift = np.fft.fftshift(fft)

    for keep_ratio in keep_list:
        compressed_shift = compression(fft_shift, keep_ratio)#压缩
        compressed_ifft_shift = np.fft.ifftshift(compressed_shift)#逆傅里叶变换
        compressed_vedio = np.abs(np.fft.ifft2(compressed_ifft_shift))

        # 转换为8位无符号整数类型
        com_uint8 = np.uint8(compressed_vedio)

        # 显示压缩后的图像
        cv2.imshow(f'{keep_ratio}', com_uint8)

    # 每隔 1ms 检查一次用户输入，如果按下 'q' 键，退出循环
    if cv2.waitKey(20) == ord('q'):
        break

# 释放视频文件
vedio.release()

# 关闭所有窗口
cv2.destroyAllWindows()
